Ext.define('AxisElement', {
			extend : 'Ext.data.Model',
			fields : [{
						name : 'value',
						type : 'string'
					}, {
						name : 'label',
						type : 'string'
					}]
		});
/*
 * var axisElementStore = new Ext.data.Store({ model : 'AxisElement', proxy : {
 * type : 'ajax', url : 'AdventureAnalyzerServlet', reader : { type : 'json' } },
 * autoLoad : false });
 */

// settings tab : table row group zone
var rs_axis0Panel = Ext.create('Ext.panel.Panel', {
	bodyPadding : 5,
	title : 'Axis(0) : COLUMNS',
	height : 120,
	layout : 'vbox',
	items : [{
		xtype : 'container',
		layout : {
			type : 'table',
			columns : 4,
			align : 'middle'
		},
		items : [{
			xtype : 'combo',
			id : 'colGrpCombo1',
			fieldLabel : 'Level 1',
			labelAlign : 'right',
			store : {
				fields : ['value', 'label'],
				data : [{
							"value" : "[Date].[Calendar Year]",
							"label" : "Year"
						}, {
							"value" : "[Date].[Calendar Quarter of Year]",
							"label" : "Quarter"
						}, {
							"value" : "[Date].[Month of Year]",
							"label" : "Month"
						}]
			},
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			allowBlank : false,
			listeners : {
				'select' : function() {
					var axisCombo = Ext.getCmp('colGrpCombo1');
					var valsCombo = Ext.getCmp('colGrpValsCombo1');
					valsCombo.clearValue();
					valsCombo.store.proxy.url = '../AdventureAnalyzerServlet?serviceType=rs&requestType=GET_AXISELMS&axis='
							+ axisCombo.getValue();
					valsCombo.store.load();
				}
			}
		}, {
			xtype : 'combo',
			id : 'colGrpValsCombo1',
			store : new Ext.data.Store({
						model : 'AxisElement',
						proxy : {
							url : "",
							method : 'GET',
							type : 'ajax',
							reader : {
								type : 'json',
								root : 'rows'
							}
						},
						autoLoad : true
					}),
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			multiSelect : true,
			width : 400,
			grow : true,
			growMax : 600
		}, {
			xtype : 'displayfield',
			id : 'colGrpVals1',
			style : {
				'white-space' : 'nowrap'
			},
			value : ''
		}]
	}, {
		xtype : 'container',
		layout : {
			type : 'table',
			columns : 4,
			align : 'middle'
		},
		items : [{
			xtype : 'combo',
			id : 'colGrpCombo2',
			fieldLabel : 'Level 2',
			labelAlign : 'right',
			store : {
				fields : ['value', 'label'],
				data : [{
							"value" : "[Date].[Calendar Quarter of Year]",
							"label" : "Quarter"
						}, {
							"value" : "[Date].[Month of Year]",
							"label" : "Month"
						}]
			},
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			listeners : {
				'select' : function() {
					var axisCombo = Ext.getCmp('colGrpCombo2');
					var valsCombo = Ext.getCmp('colGrpValsCombo2');
					valsCombo.clearValue();
					valsCombo.store.proxy.url = '../AdventureAnalyzerServlet?serviceType=rs&requestType=GET_AXISELMS&axis='
							+ axisCombo.getValue();
					valsCombo.store.load();
				}
			}
		}, {
			xtype : 'combo',
			id : 'colGrpValsCombo2',
			store : new Ext.data.Store({
						model : 'AxisElement',
						proxy : {
							url : "",
							method : 'GET',
							type : 'ajax',
							reader : {
								type : 'json',
								root : 'rows'
							}
						},
						autoLoad : true
					}),
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			multiSelect : true,
			width : 400,
			grow : true,
			growMax : 600
		}, {
			xtype : 'displayfield',
			id : 'colGrpVals2',
			style : {
				'white-space' : 'nowrap'
			},
			value : ''
		}]
	}, {
		xtype : 'container',
		layout : {
			type : 'table',
			columns : 4,
			align : 'middle'
		},
		items : [{
			xtype : 'combo',
			id : 'colGrpCombo3',
			fieldLabel : 'Level 3',
			labelAlign : 'right',
			store : {
				fields : ['value', 'label'],
				data : [{
							"value" : "[Date].[Month of Year]",
							"label" : "Month"
						}]
			},
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			listeners : {
				'select' : function() {
					var axisCombo = Ext.getCmp('colGrpCombo3');
					var valsCombo = Ext.getCmp('colGrpValsCombo3');
					valsCombo.clearValue();
					valsCombo.store.proxy.url = '../AdventureAnalyzerServlet?serviceType=rs&requestType=GET_AXISELMS&axis='
							+ axisCombo.getValue();
					valsCombo.store.load();
				}
			}
		}, {
			xtype : 'combo',
			id : 'colGrpValsCombo3',
			store : new Ext.data.Store({
						model : 'AxisElement',
						proxy : {
							url : "",
							method : 'GET',
							type : 'ajax',
							reader : {
								type : 'json',
								root : 'rows'
							}
						},
						autoLoad : true
					}),
			editable : false,
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			multiSelect : true,
			width : 400,
			grow : true,
			growMax : 600
		}, {
			xtype : 'displayfield',
			id : 'colGrpVals3',
			style : {
				'white-space' : 'nowrap'
			},
			value : ''
		}]
	}]
});

// settings tab : table column group zone
var rs_axis1Panel = Ext.create('Ext.panel.Panel', {
	bodyPadding : 5,
	title : 'Axis(1) : ROWS',
	height : 120,
	layout : 'vbox',
	items : [{
		xtype : 'container',
		layout : {
			type : 'table',
			columns : 4,
			align : 'middle'
		},
		items : [{
			xtype : 'combo',
			id : 'rowGrpCombo1',
			fieldLabel : 'Level 1',
			labelAlign : 'right',
			store : {
				fields : ['value', 'label'],
				data : [{
							"value" : "[Product].[Category]",
							"label" : "Product Category"
						}, {
							"value" : "[Sales Channel].[Sales Channel]",
							"label" : "Sales Channel"
						}, {
							"value" : "[Sales Reason].[Sales Reason]",
							"label" : "Sales Reason"
						}, {
							"value" : "[Sales Territory].[Sales Territory Group]",
							"label" : "Sales Territory Region"
						}]
			},
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			allowBlank : false,
			listeners : {
				'select' : function() {
					var axisCombo = Ext.getCmp('rowGrpCombo1');
					var valsCombo = Ext.getCmp('rowGrpValsCombo1');
					valsCombo.clearValue();
					valsCombo.store.proxy.url = '../AdventureAnalyzerServlet?serviceType=rs&requestType=GET_AXISELMS&axis='
							+ axisCombo.getValue();
					valsCombo.store.load();
				}
			}
		}, {
			xtype : 'combo',
			id : 'rowGrpValsCombo1',
			store : new Ext.data.Store({
						model : 'AxisElement',
						proxy : {
							url : "",
							method : 'GET',
							type : 'ajax',
							reader : {
								type : 'json',
								root : 'rows'
							}
						},
						autoLoad : true
					}),
			editable : false,
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			multiSelect : true,
			width : 400,
			grow : true,
			growMax : 600
		}, {
			xtype : 'displayfield',
			id : 'rowGrpVals1',
			style : {
				'white-space' : 'nowrap'
			},
			value : ''
		}]
	}, {
		xtype : 'container',
		layout : {
			type : 'table',
			columns : 4,
			align : 'middle'
		},
		items : [{
			xtype : 'combo',
			id : 'rowGrpCombo2',
			fieldLabel : 'Level 2',
			labelAlign : 'right',
			store : {
				fields : ['value', 'label'],
				data : [{
							"value" : "[Product].[Subcategory]",
							"label" : "Product Sub Category"
						}, {
							"value" : "[Sales Territory].[Sales Territory Country]",
							"label" : "Sales Territory Country"
						}]
			},
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			listeners : {
				'select' : function() {
					var axisCombo = Ext.getCmp('rowGrpCombo2');
					var valsCombo = Ext.getCmp('rowGrpValsCombo2');
					valsCombo.clearValue();
					valsCombo.store.proxy.url = '../AdventureAnalyzerServlet?serviceType=rs&requestType=GET_AXISELMS&axis='
							+ axisCombo.getValue();
					valsCombo.store.load();
				}
			}
		}, {
			xtype : 'combo',
			id : 'rowGrpValsCombo2',
			store : new Ext.data.Store({
						model : 'AxisElement',
						proxy : {
							url : "",
							method : 'GET',
							type : 'ajax',
							reader : {
								type : 'json',
								root : 'rows'
							}
						},
						autoLoad : true
					}),
			editable : false,
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			multiSelect : true,
			width : 400,
			grow : true,
			growMax : 600
		}, {
			xtype : 'displayfield',
			id : 'rowGrpVals2',
			style : {
				'white-space' : 'nowrap'
			},
			value : ''
		}]
	}, {
		xtype : 'container',
		layout : {
			type : 'table',
			columns : 4,
			align : 'middle'
		},
		items : [{
			xtype : 'combo',
			id : 'rowGrpCombo3',
			fieldLabel : 'Level 3',
			labelAlign : 'right',
			store : {
				fields : ['value', 'label'],
				data : [{
							"value" : "[Product].[Product]",
							"label" : "Product"
						}, {
							"value" : "[Reseller].[Reseller]",
							"label" : "Reseller"
						}]
			},
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			editable : false,
			listeners : {
				'select' : function() {
					var axisCombo = Ext.getCmp('rowGrpCombo3');
					var valsCombo = Ext.getCmp('rowGrpValsCombo3');
					valsCombo.clearValue();
					valsCombo.store.proxy.url = '../AdventureAnalyzerServlet?serviceType=rs&requestType=GET_AXISELMS&axis='
							+ axisCombo.getValue();
					valsCombo.store.load();
				}
			}
		}, {
			xtype : 'combo',
			id : 'rowGrpValsCombo3',
			store : new Ext.data.Store({
						model : 'AxisElement',
						proxy : {
							url : "",
							method : 'GET',
							type : 'ajax',
							reader : {
								type : 'json',
								root : 'rows'
							}
						},
						autoLoad : true
					}),
			editable : false,
			queryMode : 'local',
			displayField : 'label',
			valueField : 'value',
			multiSelect : true,
			width : 400,
			grow : true,
			growMax : 600
		}, {
			xtype : 'displayfield',
			id : 'rowGrpVals3',
			style : {
				'white-space' : 'nowrap'
			},
			value : ''
		}]
	}]
});

// settings tab : table cell zone
var rs_resultPanel = Ext.create('Ext.panel.Panel', {
	bodyPadding : 5,
	title : 'Result',
	height : 65,
	width : '100%',
	layout : 'vbox',
	items : [{
		xtype : 'container',
		layout : {
			type : 'table',
			columns : 3,
			align : 'middle'
		},
		width : '100%',
		items : [{
					xtype : 'combo',
					id : 'reportTypeCombo',
					fieldLabel : 'Report Type',
					labelAlign : 'right',
					store : {
						fields : ['value', 'label'],
						data : [{
									"value" : "ANALYSIS_TABLE",
									"label" : "Analysis Table"
								}, {
									"value" : "TOP10_GRAPHIC",
									"label" : "Top 10 Graphic"
								}, {
									"value" : "COMPARISON_GRAPHIC",
									"label" : "Comparison Graphic"
								}]
					},
					queryMode : 'local',
					displayField : 'label',
					valueField : 'value',
					editable : false,
					allowBlank : false
				}, {
					xtype : 'combo',
					id : 'cellResultCombo',
					fieldLabel : 'Cell Result',
					labelAlign : 'right',
					store : {
						fields : ['value', 'label'],
						data : [{
									"value" : "[Measures].[Order Quantity]",
									"label" : "Order Quantity"
								}, {
									"value" : "[Measures].[Sales Amount]",
									"label" : "Sales Amount"
								}, {
									"value" : "[Measures].[Average Sales Amount]",
									"label" : "Average Sales Amount"
								}, {
									"value" : "[Measures].[Gross Profit]",
									"label" : "Gross Profit"
								}]
					},
					queryMode : 'local',
					displayField : 'label',
					valueField : 'value',
					editable : false,
					allowBlank : false
				}, {
					xtype : 'combo',
					multiSelect : true,
					id : 'cellTooltipCombo',
					fieldLabel : 'Cell Tooltip',
					labelAlign : 'right',
					store : {
						fields : ['value', 'label'],
						data : [{
									"value" : "[Measures].[Order Quantity]",
									"label" : "Order Quantity"
								}, {
									"value" : "[Measures].[Sales Amount]",
									"label" : "Sales Amount"
								}, {
									"value" : "[Measures].[Average Sales Amount]",
									"label" : "Average Sales Amount"
								}, {
									"value" : "[Measures].[Gross Profit]",
									"label" : "Gross Profit"
								}]
					},
					queryMode : 'local',
					displayField : 'label',
					valueField : 'value',
					width : 400,
					editable : false,
					allowBlank : false
				}]
	}]
});

// settings tab : table features
var rs_featurePanel = Ext.create('Ext.panel.Panel', {
			bodyPadding : 5,
			title : 'Feature',
			height : 65,
			layout : 'vbox',
			items : [{
						xtype : 'container',
						layout : {
							type : 'table',
							columns : 2,
							align : 'middle'
						},
						items : [{
									xtype : 'combo',
									id : 'featureCombo',
									fieldLabel : 'Table Feature',
									labelAlign : 'right',
									store : {
										fields : ['value', 'label'],
										data : [{
													"value" : -1,
													"label" : "None"
												}, {
													"value" : 0,
													"label" : "Top 10"
												}, {
													"value" : 1,
													"label" : "Recursive"
												}, {
													"value" : 2,
													"label" : "..."
												}]
									},
									queryMode : 'local',
									displayField : 'label',
									valueField : 'value',
									editable : false,
									allowBlank : false
								}]
					}]
		});

// settings tab : action panel
var rs_callBtnPanel = Ext.create('Ext.panel.Panel', {
	bodyPadding : 5,
	height : 65,
	title : 'Action',
	layout : {
		type : 'hbox',
		align : 'middle',
		pack : 'center'
	},
	items : [{
		xtype : 'button',
		text : 'Get Report',
		handler : function() {
			// build AnalysisContext JSON object
			var colGrpCombo1 = Ext.getCmp('colGrpCombo1');
			var colGrpCombo2 = Ext.getCmp('colGrpCombo2');
			var colGrpCombo3 = Ext.getCmp('colGrpCombo3');
			var colGrpValsCombo1 = Ext.getCmp('colGrpValsCombo1');
			var colGrpValsCombo2 = Ext.getCmp('colGrpValsCombo2');
			var colGrpValsCombo3 = Ext.getCmp('colGrpValsCombo3');
			var rowGrpCombo1 = Ext.getCmp('rowGrpCombo1');
			var rowGrpCombo2 = Ext.getCmp('rowGrpCombo2');
			var rowGrpCombo3 = Ext.getCmp('rowGrpCombo3');
			var rowGrpValsCombo1 = Ext.getCmp('rowGrpValsCombo1');
			var rowGrpValsCombo2 = Ext.getCmp('rowGrpValsCombo2');
			var rowGrpValsCombo3 = Ext.getCmp('rowGrpValsCombo3');
			var reportTypeCombo = Ext.getCmp('reportTypeCombo');
			var cellResultCombo = Ext.getCmp('cellResultCombo');
			var cellTooltipCombo = Ext.getCmp('cellTooltipCombo');
			var featureCombo = Ext.getCmp('featureCombo');

			var context = {};

			var axes = [];
			var colAxes = [];
			var rowAxes = [];
			axes.push(colAxes);
			axes.push(rowAxes);

			for (var i = 0; i < 3; i++) {
				var colGrpCombo = eval(('colGrpCombo' + (i + 1)));
				var colGrpComboVal = colGrpCombo.getValue();
				if (colGrpComboVal !== null) {
					var axis = {};
					axis.name = colGrpComboVal;
					axis.axis = i;
					axis.level = i + 1;
					axis.values = [];
					var colGrpValsCombo = eval(('colGrpValsCombo' + (i + 1)));
					var colGrpValsComboVal = colGrpValsCombo.getValue();
					if (colGrpValsComboVal !== null) {
						axis.values = colGrpValsComboVal;
					}
					colAxes.push(axis);
				}
			}

			for (var i = 0; i < 3; i++) {
				var rowGrpCombo = eval(('rowGrpCombo' + (i + 1)));
				var rowGrpComboVal = rowGrpCombo.getValue();
				if (rowGrpComboVal !== null) {
					var axis = {};
					axis.name = rowGrpComboVal;
					axis.axis = i;
					axis.level = i + 1;
					axis.values = [];
					var rowGrpValsCombo = eval(('rowGrpValsCombo' + (i + 1)));
					var rowGrpValsComboVal = rowGrpValsCombo.getValue();
					if (rowGrpValsComboVal !== null) {
						axis.values = rowGrpValsComboVal;
					}
					rowAxes.push(axis);
				}
			}

			var res = [];
			if (cellResultCombo.getValue() !== null)
				res.push(cellResultCombo.getValue());
			if (cellTooltipCombo.getValue() !== null) {
				for (var v in cellTooltipCombo.getValue()) {
					res.push(cellTooltipCombo.getValue()[v]);
				}
			}

			context.axesList = axes;
			context.results = res;
			if (reportTypeCombo.getValue() !== null)
				context.reportType = reportTypeCombo.getValue();
			if (featureCombo.getValue() !== null)
				context.feature = featureCombo.getValue();
			else
				context.feature = -1;

			var ctxStr = Ext.JSON.encode(context);
			
			var rsResultTabfrm = document.getElementById("rsTabFrm");
			if (rsResultTabfrm == null) {
				Ext.getCmp('allTabs').setActiveTab(3);
				rsResultTabfrm = document.getElementById("rsTabFrm");
				Ext.getCmp('allTabs').setActiveTab(2);
			}
			rsResultTabfrm.contentWindow.document.body.innerHTML = '';
			Ext.Ajax.request({
				url : '../AdventureAnalyzerServlet?serviceType=rs&requestType=GET_REPORT',
				params : {
					"context" : ctxStr
				},
				success : function(response) {
					var rsResultTabfrm = document.getElementById("rsTabFrm");
					rsResultTabfrm.contentWindow.document.body.innerHTML = response.responseText;

					// switch tab
					Ext.getCmp('allTabs').setActiveTab(3);
				}
			});
		}
	}, {
		xtype : 'button',
		text : 'Reset',
		handler : function() {
			// Ext.Msg.alert('Information', '// TODO : Reset all value fields');
			Ext.getCmp('colGrpCombo1').reset();
			Ext.getCmp('colGrpCombo2').reset();
			Ext.getCmp('colGrpCombo3').reset();
			Ext.getCmp('colGrpValsCombo1').reset();
			Ext.getCmp('colGrpValsCombo2').reset();
			Ext.getCmp('colGrpValsCombo3').reset();
			Ext.getCmp('rowGrpCombo1').reset();
			Ext.getCmp('rowGrpCombo2').reset();
			Ext.getCmp('rowGrpCombo3').reset();
			Ext.getCmp('rowGrpValsCombo1').reset();
			Ext.getCmp('rowGrpValsCombo2').reset();
			Ext.getCmp('rowGrpValsCombo3').reset();
			Ext.getCmp('reportTypeCombo').reset();
			Ext.getCmp('cellResultCombo').reset();
			Ext.getCmp('cellTooltipCombo').reset();
			Ext.getCmp('featureCombo').reset();
			
			var rsResultTabfrm = document.getElementById("rsTabFrm");
			rsResultTabfrm.contentWindow.document.body.innerHTML = '';
		}
	}]
});